﻿using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;

namespace Standard;

[SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")]
[StructLayout(LayoutKind.Explicit)]
internal class PROPVARIANT : IDisposable
{
    [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
    public VarEnum VarType
    {
        get
        {
            return (VarEnum) this.vt;
        }
    }

    [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
    public string GetValue()
    {
        if (this.vt == 31)
        {
            return Marshal.PtrToStringUni(this.pointerVal);
        }
        return null;
    }

    public void SetValue(bool f)
    {
        this.Clear();
        this.vt = 11;
        this.boolVal = (short) (f ? -1 : 0);
    }

    [SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")]
    public void SetValue(string val)
    {
        this.Clear();
        this.vt = 31;
        this.pointerVal = Marshal.StringToCoTaskMemUni(val);
    }

    public void Clear()
    {
        PROPVARIANT.NativeMethods.PropVariantClear(this);
    }

    public void Dispose()
    {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~PROPVARIANT()
    {
        this.Dispose(false);
    }

    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "disposing")]
    private void Dispose(bool disposing)
    {
        this.Clear();
    }

    [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
    [FieldOffset(0)]
    private ushort vt;

    [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")]
    [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
    [FieldOffset(8)]
    private IntPtr pointerVal;

    [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
    [FieldOffset(8)]
    private byte byteVal;

    [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
    [FieldOffset(8)]
    private long longVal;

    [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
    [FieldOffset(8)]
    private short boolVal;

    private static class NativeMethods
    {
        [DllImport("ole32.dll")]
        internal static extern HRESULT PropVariantClear(PROPVARIANT pvar);
    }
}
